import axios from 'axios'
import { Message } from 'element-ui'
// import { getToken } from '@/utils/auth'
import store from '@/store'
import router from '@/router'
// 创建axios实例
const request = axios.create({
  // baseURL: 'https://heimahr.itheima.net/api', // 无法直接访问目标服务器
  // baseURL: 'http://localhost:9528/api', // 请求代理（代理和网页同源）
  // process全局变量
  baseURL: process.env.VUE_APP_BASE_API, // 简写
  timeout: 200000
})
// 添加请求拦截器
request.interceptors.request.use(
  /**
   * 请求拦截器成功处理函数
   *
   * @param {Object} config - 请求配置对象
   * @returns {Object} 返回处理后的请求配置对象
   */
  function(config) {
    // 在发送请求之前做些什么
    // const token = getToken()// 从本地存储中获取token
    const token = store.getters.token// 从仓库中获取token
    if (token) {
      // 携带token
      config.headers.Authorization = 'Bearer ' + token
    }
    // 让以后的请求自带token
    return config
  },
  /**
   * 请求拦截器失败处理函数
   *
   * @param {Object} error - 错误对象
   * @returns {Promise} 返回一个被拒绝的 Promise
   */
  function(error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
request.interceptors.response.use(
  /**
   * 响应拦截器成功处理函数
   *
   * @param {Object} response - 响应对象
   * @returns {Object} 返回处理后的响应数据
   */
  function(response) {
    // 解构
    // const { message, success, data } = response.data
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    // 对于二进制文件流 没有res.data.data  只有res.data（文件数据）
    if (response.data instanceof Blob) {
      return response.data// 直接返回data
    }

    if (response.data.success) {
      // 如果响应数据中存在 data 字段，则返回该字段
      return response.data.data
    } else {
      // 请求失败的提示
      Message.error(response.data.message)
      // 如果响应数据中不存在 data 字段，则抛出一个错误
      return Promise.reject(new Error('失败'))
    }
  },
  /**
   * 响应拦截器失败处理函数
   *
   * @param {Object} error - 错误对象
   * @returns {Promise} 返回一个被拒绝的 Promise
   */
  function(error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    if (error.response.status === 401) {
      store.dispatch('user/logout')
      router.push('/login')
      Message.error('你过期了, 请重新登录') // 定制一个提示文本
    } else {
      Message.error(error.message) // 专业的错误提示
    }

    return Promise.reject(error)
  }
)
export default request
